<?php
namespace frame;

use frame\libs\Config;

/**
 * 框架初始类
 */
final class Frame
{
    /**
     * 运行框架
     * @return [type] [description]
     */
    public static function run()
    {
        //初始化类的自动加载
        self::initAutoLoad(); 
        //初始化配置信息
        self::initConfig(); 
        //初始化路由参数
        self::initRoute(); 
        //初始化请求分发
        self::initDisPatch(); 
    }

    /**
     * 命名空间自动加载
     * @return [type] [description]
     */
    private static function initAutoLoad()
    {
        spl_autoload_register( function($className)
        {
            $fileName = ROOT_PATH . str_replace("\\", DS, $className) . ".php";
            if (is_file($fileName)) {
                require_once($fileName);
            }
        });
    }

    /**
     * 加载配置
     * @return [type] [description]
     */
    private static function initConfig()
    {
        // 引入配置类
        // debug
        if (Config::get('app_debug', 'app')) {
            ini_set('display_errors', 'true');
            error_reporting(E_ALL);
        } else {
            ini_set('display_errors', 'off');
        }
        // session
        if (Config::get('auto_start', 'authorize')) {
            session_start();
        }
        // 设置系统时区
        date_default_timezone_set(Config::get('default_timezone', 'app'));
    }

    /**
     * 初始化路由参数
     * @return [type] [description]
     */
    private static function initRoute()
    {
        // 获取GET路由参数
        $module = isset($_GET['m']) ? $_GET['m'] : Config::get('default_module', 'app');
        $controller = isset($_GET['c']) ? $_GET['c'] : Config::get('default_controller', 'app');
        $action = isset($_GET['a']) ? $_GET['a'] : Config::get('default_action', 'app');
        // 定义路由常量
        define("MODULE", $module);
        define("CONTROLLER", $controller);
        define("ACTION", $action);
        // 视图目录常量
        define("VIEW_PATH", APP_PATH . MODULE . DS . "view" . DS); 
    }

    /**
     * 初始化路径分发
     * @return [type] [description]
     */
    private static function initDisPatch()
    {
        if (is_file(APP_PATH . MODULE . DS . "controller" . DS . CONTROLLER . "Controller.php")) {
            $controllerClassName = 'app' . "\\" . MODULE . "\\" . "controller" . "\\" . CONTROLLER . "Controller";
            $actionName = ACTION;
            $controllerObj = new $controllerClassName();
            if (method_exists($controllerObj, $actionName)) {
                $controllerObj->$actionName();
            } else {
                self::error404();
            }
        } else {
            self::error404();
        }
    }

    /**
     * 404配置
     * @return [type] [description]
     */
    private static function error404()
    {
        // 获取路由参数配置
        $module = Config::get('empty_module', 'app');
        $controller = Config::get('empty_controller', 'app'); 
        $action = Config::get('empty_action', 'app');
        // 加载404
        $controllerClassName = 'app' . "\\" . $module . "\\" . "controller" . "\\" . $controller . "Controller";
        $controllerObj = new $controllerClassName();
        $controllerObj->$action();
    }
} 